import { getCartTotal, addCart, getCartList, updateCartNum, updateDel } from '@/apis/cart'

// 封装购物车相关数据，用于多组件共享
export default {
  namespaced: true,
  state: {
    cartTotal: {},
    cartList: [],
    goodsNum: 1,
    cartNum: 0,
    showCart: false
  },
  getters: {
    // 过滤出选中的
    isChecked (state) {
      return state.cartList.filter(item => item.isChecked)
    },
    // 公共数据的计算属性，只有选中的才合计
    // 第二个参数可以用于访问getters中的其他计算属性
    totalPrice (state, getters) {
      return getters.isChecked.reduce((sum, current) => {
        return sum + current.goods_num * +current.goods.goods_price_min
      }, 0)
    },
    // 购物车总数
    totalNum (state, getters) {
      return getters.notDelCartList.reduce((sum, current) => sum + current.goods_num, 0)
    },
    // 检查所有的复选框状态，如果全部都选中，那么就设置全选按钮为选中状态
    isAllChecked (state) {
      const flag = state.cartList.every(item => item.isChecked === true)
      // console.log(flag)
      return flag
    },
    // 判断去结算和删除的按钮，只要有一个为true，那么就解除禁用，使用数组的some方法
    isAnyChecked (state) {
      return state.cartList.some(item => item.isChecked)
    },
    // 只要有一个不是被删除的，就显示购物车
    isAnyDeleted (state) {
      return state.cartList.some(item => item.is_delete === 0)
    },
    // 过滤出所有选中的id
    mapDelId (state, getters) {
      return getters.isChecked.map(item => item.id)
    },
    // 渲染没有被逻辑删除的数据
    notDelCartList (state) {
      return state.cartList.filter(item => item.is_delete === 0)
    }
  },
  mutations: {
    // 修改购物车状态
    setCartState (state, data) {
      state.showCart = data
    },
    // 同步方法
    setCartTotal (state, data) {
      state.cartTotal = data
    },
    addCart (state, total) {
      state.cartTotal = total
    },
    setCartList (state, data) {
      // 设置全部的购物车为选中状态
      state.cartList = data
      // state.cartList.forEach(item => { item.isChecked = true })
    },
    updateCartNum (state, res) {
      // console.log(state.cartList.find(item => item.goods_id === res.id))
      state.cartList.find(item => item.goods_id === res.id).goods_num = res.num
    },
    // 修改选中状态
    changeChecked (state, id) {
      const item = state.cartList.find(item => item.goods_id === id)
      console.log(item)
      item.isChecked = !item.isChecked
    },
    // 设置全选
    setAllChecked (state, isChecked) {
      state.cartList.forEach(item => { item.isChecked = isChecked })
    },
    /**
     * @param {*} state
     * @param {*} delArray 选中的id数组
     */
    updateDel (state, delArray) {
      // 双重遍历去判断
      state.cartList.forEach((item) => {
        delArray.forEach((id) => {
          if (item.id === id) {
            item.is_delete = 1
          }
        })
      })
    }
  },
  actions: {
    // 异步方法
    async AsyncgetCartTotal (ctx) {
      const { data: { cartTotal } } = await getCartTotal()
      console.log(cartTotal)
      debugger
      ctx.commit('setCartTotal', cartTotal)
    },
    async AsyncAddCart (ctx, data) {
      const res = await addCart(data)
      ctx.commit('addCart', res.data.cartTotal)
    },
    async AsyncgetCartList (ctx) {
      try {
        const { data: { cartTotal, list } } = await getCartList()
        if (!list) {
          return
        }
        // 数据只初始化一次
        list.forEach(item => { item.isChecked = true })
        ctx.commit('setCartTotal', cartTotal)
        ctx.commit('setCartList', list)
      } catch (error) {
        console.log(error)
      }
    },
    // 发送异步请求，进行购物车数量的更新
    async AsyncUpdateCartNum (ctx, params) {
      const { data: { cartTotal } } = await updateCartNum(params)
      console.log(cartTotal)
      // 还是需要修改cartList中对应的数量的，否则合计没法计算
      // ctx.commit('updateCartNum', { id: params.goodsId, num: cartTotal })
      ctx.commit('updateCartNum', { id: params.goodsId, num: params.goodsNum })
    },
    async AsyncUpdateDel (ctx) {
      const delArray = ctx.getters.mapDelId
      const { data: { cartTotal } } = await updateDel(delArray)
      console.log(cartTotal)
      ctx.commit('updateDel', delArray)
      ctx.commit('setCartTotal', cartTotal)
    }
  }
}
